/**
 * 
 */
package com.cplsystems.incidencias.vm.incidencias;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.joda.time.DateTime;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zul.Window;

import com.cplsystems.incidencias.app.utils.IncidenciasConstants;
import com.cplsystems.incidencias.app.utils.IncidenciasUtils;
import com.cplsystems.incidencias.business.DatosGenerales;
import com.cplsystems.incidencias.business.Incidencias;
import com.cplsystems.incidencias.business.Organizacion;
import com.cplsystems.incidencias.business.OrganizacionPersonal;
import com.cplsystems.incidencias.business.Persona;
import com.cplsystems.incidencias.business.TipoIncidencia;
import com.cplsystems.incidencias.vm.incidencias.utils.IncidenciasVariables;

/**
 * @author César Palalía López (csr.plz@aisa-automation.com)
 * 
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class IncidenciasVM extends IncidenciasVariables {

	private static final long serialVersionUID = 1022808479271905267L;

	@Init
	@NotifyChange("incidencias")
	public void init() {
		super.init();
		cargarEmpleados();
	}

	private void cargarEmpleados() {
		if (!incidencias.isEmpty()) {
			return;
		}
		Organizacion organizacion = (Organizacion) sessionUtils
				.getFromSession(IncidenciasUtils
						.encrypt(IncidenciasConstants.FIRMA));

		List<OrganizacionPersonal> organizacionPersonal = organizacionPersonalService
				.getPersonalByOrganizacion(organizacion);
		if (organizacionPersonal != null) {
			for (OrganizacionPersonal personal : organizacionPersonal) {
				Incidencias incidencia = new Incidencias();
				Persona persona = personal.getPersona();
				DatosGenerales datosGenerales = datosGeneralesService
						.getDatosGeneralesByPersona(persona);
				persona.setApellidoMaterno(datosGenerales.getApellidoMaterno());
				persona.setApellidoPaterno(datosGenerales.getApellidoPaterno());
				persona.setNombre(datosGenerales.getNombre());
				incidencia.setPersona(personal.getPersona());
				incidencias.add(incidencia);
				incidenciasTempModel.add(incidencia);
			}
		}
	}

	@NotifyChange("incidencias")
	@Command
	public void filterValues() {
		List<Incidencias> incidencias = new ArrayList<Incidencias>();
		Long id = incidenciasFilter.getPersona().getIdPersona();
		String nombre = incidenciasFilter.getPersona().getNombre()
				.toLowerCase();
		String apellidoPaterno = incidenciasFilter.getPersona()
				.getApellidoPaterno().toLowerCase();
		String apellidoMaterno = incidenciasFilter.getPersona()
				.getApellidoMaterno().toLowerCase();
		if ((id == null)
				&& (nombre == null || nombre.isEmpty())
				&& (apellidoPaterno == null || apellidoPaterno.isEmpty()
						&& apellidoMaterno == null || apellidoMaterno.isEmpty())) {
			this.incidencias.clear();
			this.incidencias.addAll(incidenciasTempModel);
			return;
		} else {
			if (this.incidencias.isEmpty()) {
				this.incidencias.addAll(incidenciasTempModel);
			}
		}

		for (Iterator<Incidencias> i = this.incidencias.iterator(); i.hasNext();) {
			Incidencias tmp = i.next();
			if (tmp.getPersona().getNombre().toLowerCase().contains(nombre)
					&& tmp.getPersona().getApellidoPaterno().toLowerCase()
							.contains(apellidoPaterno)
					&& tmp.getPersona().getApellidoMaterno().toLowerCase()
							.contains(apellidoMaterno)
					&& id.equals(tmp.getPersona().getIdPersona())) {
				incidencias.add(tmp);
			}
		}
		this.incidencias.clear();
		this.incidencias.addAll(incidencias);
	}

	@Command
	public void mostrarDetalles(
			@BindingParam("incidencia") Incidencias incidencia) {
		if (incidencia != null) {
			Map<String, Object> faltas = new HashMap<String, Object>();
			faltas.put("incidencia", incidencia);
			Window referenciasView = incidenciasUtils
					.createModelDialogWithParams(
							IncidenciasConstants.GLOBAL_PAGES.INCIDENCIAS_FALTAS,
							faltas);
			referenciasView.doModal();
		}
	}

	@NotifyChange({ "hideIncidenciasFields", "incidencias" })
	@Command
	public void seleccionarIncidencia() {
		if (reporteIncidenciaSeleccionada.equals(TipoIncidencia.DIA)) {
			hideIncidenciasFields = true;
			incidencias.clear();
			cargarEmpleados();
		} else if (reporteIncidenciaSeleccionada
				.equals(TipoIncidencia.EMPLEADO)) {
			
			hideIncidenciasFields = false;
			DateTime dateTime = new DateTime();
			int maxDays = dateTime.dayOfMonth().withMaximumValue().dayOfMonth()
					.get();
			incidencias.clear();
			for (int i = 0; i < maxDays; i++) {
				incidencias.add(new Incidencias());
			}
		}
	}

}
